MinIO 自定义策略文件编写

  • ~6.21K 字
  1. 1. 🧩 一、策略文件基础结构
    1. 1.1. 字段说明
  2. 2. 🧱 二、资源标识符(Resource)说明
  3. 3. ⚙️ 三、Action(操作)对照表
  4. 4. 📜 四、常见策略模板
    1. 4.1. ✅ 1️⃣ 只读策略(ReadOnly)
    2. 4.2. ✅ 2️⃣ 只写策略(WriteOnly)
    3. 4.3. ✅ 3️⃣ 读写策略(ReadWrite)
    4. 4.4. ✅ 4️⃣ 限定路径访问策略(特定目录)
    5. 4.5. ✅ 5️⃣ 禁止删除对象(保护数据)
  5. 5. 🧾 五、策略管理命令
  6. 6. 🧰 六、策略与用户关系
  7. 7. 🧠 七、编写策略的最佳实践
  8. 8. 📚 八、参考命令实践
  9. 9. 🧩 九、示例:多目录分级权限策略
  10. 10. 🔒 十、策略调试技巧

🧩 一、策略文件基础结构

MinIO 策略文件是标准的 JSON 文档,结构如下:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": ["arn:aws:s3:::mybucket/*"]
    }
  ]
}

字段说明

字段名 类型 说明
Version 字符串 固定为 "2012-10-17",表示策略语法版本
Statement 数组 权限语句集合,可以包含多个对象
Effect 字符串 "Allow"(允许)或 "Deny"(拒绝)
Action 数组 指定允许/拒绝的操作类型
Resource 数组 指定策略作用的资源(bucket 或对象路径)

🧱 二、资源标识符(Resource)说明

MinIO 采用与 AWS 一致的 ARN(Amazon Resource Name)格式来标识资源:

arn:aws:s3:::bucket-name[/object-path/*]
示例 含义
"arn:aws:s3:::mybucket" 指代桶本身(bucket-level 操作)
"arn:aws:s3:::mybucket/*" 桶内所有对象(object-level 操作)
"arn:aws:s3:::mybucket/projectA/*" 限制访问到特定路径下的对象
"arn:aws:s3:::*" 所有桶(⚠️谨慎使用)

⚙️ 三、Action(操作)对照表

操作类型 Action 值 说明
查看对象 s3:GetObject 读取、下载对象
上传对象 s3:PutObject 上传文件
删除对象 s3:DeleteObject 删除对象
列出对象 s3:ListBucket 查看 bucket 文件列表
获取桶信息 s3:GetBucketLocation 获取桶位置信息
创建桶 s3:CreateBucket 创建新 bucket
删除桶 s3:DeleteBucket 删除 bucket
所有操作 s3:* 包含以上所有权限(仅限管理员)

💡 对象级操作(如 Get/Put/Delete)适用于 bucket/*
桶级操作(如 ListBucket)适用于 bucket


📜 四、常见策略模板

✅ 1️⃣ 只读策略(ReadOnly)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListBucket"
      ],
      "Resource": ["arn:aws:s3:::<bucket>"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": ["arn:aws:s3:::<bucket>/*"]
    }
  ]
}

👉 用户可以浏览与下载对象,但不能上传或删除。


✅ 2️⃣ 只写策略(WriteOnly)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": ["arn:aws:s3:::<bucket>"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:AbortMultipartUpload",
        "s3:ListMultipartUploadParts"
      ],
      "Resource": ["arn:aws:s3:::<bucket>/*"]
    }
  ]
}

👉 用户可上传对象,但看不到文件列表或内容。


✅ 3️⃣ 读写策略(ReadWrite)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListBucket",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": ["arn:aws:s3:::<bucket>"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:AbortMultipartUpload",
        "s3:ListMultipartUploadParts"
      ],
      "Resource": ["arn:aws:s3:::<bucket>/*"]
    }
  ]
}

👉 最常用的业务策略,允许完整文件操作。


✅ 4️⃣ 限定路径访问策略(特定目录)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject"],
      "Resource": ["arn:aws:s3:::mybucket/projectA/*"]
    }
  ]
}

👉 用户只能操作 projectA 子目录,不影响其他目录。


✅ 5️⃣ 禁止删除对象(保护数据)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": ["s3:DeleteObject"],
      "Resource": ["arn:aws:s3:::mybucket/important/*"]
    },
    {
      "Effect": "Allow",
      "Action": ["s3:*"],
      "Resource": ["arn:aws:s3:::mybucket/*"]
    }
  ]
}

👉 防止误删重要目录内容。


🧾 五、策略管理命令

操作 命令示例
创建策略 mc admin policy create myminio readonly readonly.json
查看策略 mc admin policy info myminio readonly
删除策略 mc admin policy remove myminio readonly
列出策略 mc admin policy list myminio
绑定到用户 mc admin policy set myminio readonly user=john
绑定到组 mc admin policy set myminio readonly group=devteam

🧰 六、策略与用户关系

每个用户或组都可以绑定一个或多个策略。

查看用户详情(含绑定策略):

mc admin user info myminio <username>

绑定新策略:

mc admin policy attach myminio <policyname> --user <username>

解绑策略:

mc admin policy detach myminio <policyname> --user <username>

🧠 七、编写策略的最佳实践

1. 最小权限原则(Least Privilege)
只授予用户完成任务所需的最小操作权限。

2. 桶级与对象级区分清晰

  • s3:ListBucket → 作用于 bucket

  • s3:GetObjects3:PutObject → 作用于对象路径

3. 合理使用 Deny
Deny 优先级高于 Allow,可用于保护目录或关键数据。

4. 测试再上线
先用测试用户验证策略生效,再应用到生产。

5. 版本管理与备份
保存所有策略文件到 Git 仓库,便于审计与回溯。


📚 八、参考命令实践

# 创建策略文件 
vim readonly-bucket.json  

# 导入策略 
mc admin policy create myminio readonly-bucket readonly-bucket.json  

# 查看策略内容 
mc admin policy info myminio readonly-bucket  

# 为用户绑定策略 
mc admin policy attach myminio readonly-bucket --user bucketreader 
 
# 验证策略是否生效 
mc admin user info myminio bucketreader

🧩 九、示例:多目录分级权限策略

如果你希望用户:

  • projectA 目录有读写权限;

  • projectB 目录仅可读;
    可以编写如下复合策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
      "Resource": ["arn:aws:s3:::mybucket/projectA/*"]
    },
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": ["arn:aws:s3:::mybucket/projectB/*"]
    }
  ]
}

🔒 十、策略调试技巧

  • 查看服务器日志:
mc admin trace -v myminio

可实时观察用户请求与策略匹配情况。

  • 若策略不生效:
  • 检查 Resource 路径是否写错;
  • 确认策略已绑定到正确用户;
  • 避免使用 arn:aws:s3:::mybucket 忘记加 /*